import dayjs from "dayjs";

/**
 * 柯里化函数
 * @param fn 传入函数方法
 * @param args 参数
 * @returns 新函数
 */
export const currying = (fn: Function, ...args: any[]) => {
  // 判断当前函数是否执行完毕
  if (args.length >= fn.length) {
    return fn(...args);
  }
  return (...args2: any[]) => {
    return currying(fn, ...args, ...args2);
  };
};

/**
 *  时间格式化
 * @param text
 * @returns
 */
export const formartDateEmpty = (text: any) => {
  if (text === null || text === "") {
    return "-";
  }
  return dayjs(text).format("YYYY-MM HH:mm:ss");
};

/**
 * 删除对象中的空属性
 * @param obj
 * @returns
 */
export const delNullProperty = (obj: any) => {
  if (!obj) return;
  const temp = JSON.parse(JSON.stringify(obj));
  for (const i in temp) {
    // 遍历对象中的属性
    if (temp[i] === undefined || temp[i] === null || temp[i] === "") {
      // 首先除去常规空数据，用delete关键字
      delete temp[i];
    } else if (temp[i].constructor === Object) {
      // 如果发现该属性的值还是一个对象，再判空后进行迭代调用
      if (Object.keys(temp[i]).length === 0) delete temp[i]; // 判断对象上是否存在属性，如果为空对象则删除
      delNullProperty(temp[i]);
    } else if (temp[i].constructor === Array) {
      // 对象值如果是数组，判断是否为空数组后进入数据遍历判空逻辑
      if (temp[i].length === 0) {
        // 如果数组为空则删除
        delete temp[i];
      } else {
        for (let index = 0; index < temp[i].length; index++) {
          // 遍历数组
          if (
            temp[i][index] === undefined ||
            temp[i][index] === null ||
            temp[i][index] === "" ||
            JSON.stringify(temp[i][index]) === "{}"
          ) {
            temp[i].splice(index, 1); // 如果数组值为以上空值则修改数组长度，移除空值下标后续值依次提前
            index--; // 由于数组当前下标内容已经被替换成下一个值，所以计数器需要自减以抵消之后的自增
          }
          if (temp[i].constructor === Object) {
            // 如果发现数组值中有对象，则再次进入迭代
            delNullProperty(temp[i]);
          }
        }
      }
    }
  }
  return temp;
};

/**
 * 获取localstorage中的token
 * @returns token
 */
export const getToken = () => {
  return localStorage.getItem("token");
};

/**
 * 设置localstorage中的token
 * @returns token
 */
export const setToken = (value: string) => {
  return localStorage.setItem("token", value);
};

/**
 * 移除localstorage中的token
 * @returns
 */
export const removeToken = () => {
  return localStorage.removeItem("token");
};
/**
 * 转换为菜单树
 * @param list
 * @returns
 */
export const listToMenuTree = (list: SysMenu[]): MenuItemType[] => {
  const tree: MenuItemType[] = [];
  for (const node of list) {
    // 如果没有pid就可以认为是根节点
    if (node.pid === "0") {
      let p: MenuItemType = {
        key: node.url,
        label: node.name,
      };
      p.children = getChildren(node.id, list);
      tree.push(p);
    }
  }
  function getChildren(id: string, list: SysMenu[]) {
    const children = [];
    for (const node of list) {
      if (node.pid === id) {
        let p: MenuItemType = {
          key: node.url,
          label: node.name,
        };
        children.push(p);
      }
    }

    for (const node of children) {
      const children = getChildren(node.id, list);
      if (children.length) {
        node.children = children;
      }
    }

    return children;
  }
  return tree;
};

